// 1、看下面一段程序，回答问题
//  s1 := make([]int, 3, 4)
//  s2 := append(s1, 1)
//(1) 请问s1、s2内各有什么元素？
//(2) s1修改一个元素会影响s2吗？s2修改一个元素会影响s1吗？
//(3) s2再增加一个元素会怎么样
// 答：
// (1) s1  [0 0 0]
//     s2  [0 0 0 1]
// (2) s1 修改一个元素会影响s2，因为s2是参照到s1,
//     s2修改一个元素不会影响s1, 因为s1的组成与s2无关
//
// (3) s2的切片是指向s1的底层数组的cap是4已满，s2会扩容另觅它处，
//     将原先s1底层数组的值拷贝到新的地址，再增加新的元素到尾端。原来s1不受影响。

package main

import "fmt"

func main() {
	s1 := make([]int, 3, 4)
	fmt.Printf("s1: slice header %p  underlying array %p l=%-2d, c=%-2d %v\n", &s1, &s1[0], len(s1), cap(s1), s1)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	s2 := append(s1, 1)

	fmt.Printf("s1: after append 1 element slice header %p  underlying array %p l=%-2d, c=%-2d %v\n", &s1, &s1[0], len(s1), cap(s1), s1)
	fmt.Printf("s2: after append 1 element slice header %p  underlying array %p l=%-2d, c=%-2d %v\n", &s2, &s2[0], len(s2), cap(s2), s2)
	fmt.Println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
	s2 = append(s2, 2)
	//fmt.Println(s2)
	fmt.Printf("s1: after append 1 more element slice header %p  underlying array %p l=%-2d, c=%-2d %v\n", &s1, &s1[0], len(s1), cap(s1), s1)
	fmt.Printf("s2: after append 1 more element slice header %p  underlying array %p l=%-2d, c=%-2d %v\n", &s2, &s2[0], len(s2), cap(s2), s2)
}
